package chapter3;

import java.util.concurrent.atomic.LongAdder;

/**
 * @author caiya
 * @date 2020/3/24 22:15
 */
public class LongAdderTest {
    static LongAdder longAdder = new LongAdder();

    static long[] data1 = {0,1,2,3,4,6,0,3434,0,23,1,0};
    static long[] data2 = {0,1,0,3,4,6,0,0,0,23,1,0};

    public static void main(String[] args) throws InterruptedException {
        /**
         * LongAdder 快在哪里：
         *      1）AtomLong 原子类会存在多线程竞争一个 long 值的问题，导致线程自旋重试，高并发下性能下降
         *      2）LongAdder 将一个 long 值分散到一个 Cell 数组中，这样多线程会命中不同的 Cell（每个 Cell 都关联一个 long 类型的值），达到分散热点，降级线程冲突的几率，
         *          从而提高并发。
         *      3）LongAdder 实际的值是 base 值加上所有 Cell 数组的 long 类型的值的和
         *      4）LongAdder 本质上属于 “空间换时间”的思想，可能会导致内存上升相比 AtomLong 的话
         *
         */
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                for (long data: data1) {
                    if (data == 0) {
                        longAdder.increment();
                    }
                }
            }
        });

        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (long data: data2) {
                    if (data == 0) {
                        longAdder.increment();
                    }
                }
            }
        });

        thread.start();
        thread1.start();

        thread.join();
        thread1.join();

        System.out.println("总计:" + longAdder.sum());
    }
}
